#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>

// 单子进程
int main()
{
	pid_t id = fork();
	if(id < 0)
	{
		perror("fork");
		exit(1);
	}
	else if(id == 0)
	{
		//子进程
		int cnt = 7;
		while(cnt)
		{
			printf("I am a child, pid:%d, ppid:%d, cnt: %d\n", getpid(),getppid(), cnt);
			sleep(1);
			cnt--;
		}
	//	int a = 10;
	//	a /= 0;
		exit(10);
	}
	else
	{
		//父进程
		int cnt = 5;
		while(cnt)
		{
			printf("I am a father, pid:%d, ppid:%d, cnt: %d\n", getpid(),getppid(), cnt);
			sleep(1);
			cnt--;
		}
		//pid_t ret = wait(NULL);
		int status;
		//pid_t ret = waitpid(id, &status, 0);
		while(1)
		{			
			pid_t ret = waitpid(id, &status, WNOHANG);
			if(ret == id)
			{
		
				//printf("wait success! ret:%d, status: %d\n", ret, status);
				if(WIFEXITED(status)) //无异常
				{
					printf("程序是正常运行结束的！退出码为：%d\n", WEXITSTATUS(status));
				}
				else
				{
					printf("程序异常退出！信号为：%d\n", (status&0x7F));
				}
				break;
			}
			else if(ret < 0)
			{
				printf("wait fail!\n");
				break;
			}
			else
			{
				printf("父进程你再等等，很快就完成了！\n");
				sleep(1);
			}
		}
		sleep(3);
	}
	return 0;

}

//多个子进程
//#define N 10
//
//void ChildRun()
//{
//	int cnt = 3;
//	while(cnt)
//	{
//		printf("I am a child, pid:%d, ppid:%d, cnt: %d\n", getpid(),getppid(), cnt);
//		cnt--;
//		sleep(1);
//	}
//}
//
//int main()
//{
//	for(int i = 0; i < N; i++)
//	{
//		pid_t id = fork();
//		{
//			if(id == 0)
//			{
//				ChildRun();
//				exit(i); //退出码会变化
//			}
//		}
//		printf("Creat Child Process:%d success\n", id);//父进程执行
//	}
//
//	sleep(5);
//	for(int i = 0; i < N; i++)
//	{
//		//pid_t ret = wait(NULL);
//		int status;
//		pid_t ret = waitpid(-1,&status,0);
//		if(ret > 0)
//		{
//			if(WIFEXITED(status))
//				printf("wait %d success, exit code: %d\n", ret, WEXITSTATUS(status));
//			else
//				printf("进程退出异常！\n");
//		}
//	}
//	sleep(3);
//	return 0;
//}
